package utils.test;

import static org.junit.Assert.*;

import java.util.Calendar;
import java.util.Date;

import org.junit.Test;

import utils.Rango;
import utils.exceptions.RangoRecibioDesdeDespuesQueHastaException;

public class ManejoDeRangos {

	@Test
	public void testCrearRango() throws RangoRecibioDesdeDespuesQueHastaException {
		Calendar cal = Calendar.getInstance();
		Date hoy = cal.getTime();
		cal.add(Calendar.DATE, -1);
		Date ayer = cal.getTime();
		Rango<Date> rango = new Rango<Date>(ayer,hoy);
		assertNotNull(rango);
	}
	
	@Test
	public void testCrearRangoSinLimiteInferior() throws RangoRecibioDesdeDespuesQueHastaException {
		Date hasta = new Date();
		Rango<Date> rango = new Rango<Date>(null,hasta);
		assertNotNull(rango);
	}
	
	@Test
	public void testCrearRangoSinLimiteSuperior() throws RangoRecibioDesdeDespuesQueHastaException {
		Date desde = new Date();
		Rango<Date> rango = new Rango<Date>(desde,null);
		assertNotNull(rango);
	}
	
	@Test
	public void testCrearRangoSinLimites() throws RangoRecibioDesdeDespuesQueHastaException {
		Rango<Date> rango = new Rango<Date>(null,null);
		assertNotNull(rango);
	}

	@Test
	public void testAbarcaRango() throws RangoRecibioDesdeDespuesQueHastaException {
		Calendar cal = Calendar.getInstance();
		Date hoy = cal.getTime();
		cal.add(Calendar.DATE, -1);
		Date ayer = cal.getTime();
		cal.add(Calendar.DATE, -1);
		Date anteAyer = cal.getTime();
		
		Rango<Date> rango = new Rango<Date>(anteAyer,hoy);
		assertTrue(rango.abarca(ayer));
	}
	
	@Test
	public void testAbarcaRangoSinLimiteInferior() throws RangoRecibioDesdeDespuesQueHastaException {
		Date hasta = new Date();
		Rango<Date> rango = new Rango<Date>(null,hasta);
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DATE, -1);
		assertTrue(rango.abarca(cal.getTime()));
	}
	
	@Test
	public void testNoAbarcaRangoSinLimiteInferior() throws RangoRecibioDesdeDespuesQueHastaException {
		Date hasta = new Date();
		Rango<Date> rango = new Rango<Date>(null,hasta);
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DATE, 1);
		assertFalse(rango.abarca(cal.getTime()));
	}
	
	@Test
	public void testAbarcaRangoSinLimiteSuperior() throws RangoRecibioDesdeDespuesQueHastaException {
		Date desde = new Date();
		Rango<Date> rango = new Rango<Date>(desde, null);
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DATE, 1);
		assertTrue(rango.abarca(cal.getTime()));
	}
	
	@Test
	public void testNoAbarcaRangoSinLimiteSuperior() throws RangoRecibioDesdeDespuesQueHastaException {
		Date desde = new Date();
		Rango<Date> rango = new Rango<Date>(desde, null);
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DATE, -1);
		assertFalse(rango.abarca(cal.getTime()));
	}
	
	@Test
	public void testAbarcaRangoSinLimites() throws RangoRecibioDesdeDespuesQueHastaException {
		Rango<Date> rango = new Rango<Date>(null,null);
		Date hasta = new Date();
		assertTrue(rango.abarca(hasta));
	}
	
	@Test
	public void testSolapaRango() throws RangoRecibioDesdeDespuesQueHastaException {
		Calendar cal = Calendar.getInstance();
		Date hoy = cal.getTime();
		cal.add(Calendar.WEEK_OF_MONTH, -1);
		Date haceUnaSemana = cal.getTime();
		
		cal = Calendar.getInstance();
		cal.add(Calendar.DATE, -1);
		Date ayer = cal.getTime();
		cal.add(Calendar.DATE, 2);
		Date pasadoManana = cal.getTime();
				
		Rango<Date> rangoLargo = new Rango<Date>(haceUnaSemana, hoy);
		Rango<Date> rangoCorto = new Rango<Date>(ayer, pasadoManana);

		assertTrue( rangoLargo.solapa(rangoCorto) );
		assertTrue( rangoCorto.solapa(rangoLargo) );
	}
	
	@Test
	public void testNoSolapaRango() throws RangoRecibioDesdeDespuesQueHastaException {
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DATE, 1);
		Date manana = cal.getTime();
		cal.add(Calendar.DATE, 6);
		Date dentroDeUnaSemana = cal.getTime();
		
		cal = Calendar.getInstance();
		cal.add(Calendar.DATE, -1);
		Date ayer = cal.getTime();
		cal.add(Calendar.DATE, -6);
		Date haceUnaSemana = cal.getTime();
				
		Rango<Date> rangoFuturo = new Rango<Date>(manana, dentroDeUnaSemana);
		Rango<Date> rangoPasado = new Rango<Date>(haceUnaSemana, ayer);

		assertFalse(rangoPasado.solapa(rangoFuturo));
		assertFalse(rangoFuturo.solapa(rangoPasado));
	}
	
	
	@Test
	public void testSolapaRangoInteger() throws RangoRecibioDesdeDespuesQueHastaException {
		Integer hoy = 20;
		Integer haceUnaSemana = 13;
		Integer ayer = 19;
		Integer pasadoManana = 22;
				
		Rango<Integer> rangoLargo = new Rango<Integer>(haceUnaSemana, hoy);
		Rango<Integer> rangoCorto = new Rango<Integer>(ayer, pasadoManana);

		assertTrue( rangoLargo.solapa(rangoCorto) );
		assertTrue( rangoCorto.solapa(rangoLargo) );
	}
	
	@Test
	public void testNoSolapaRangoInteger() throws RangoRecibioDesdeDespuesQueHastaException {
		Integer manana = 21;
		Integer dentroDeUnaSemana = 27;
		Integer ayer = 19;
		Integer haceUnaSemana = 13;
				
		Rango<Integer> rangoFuturo = new Rango<Integer>(manana, dentroDeUnaSemana);
		Rango<Integer> rangoPasado = new Rango<Integer>(haceUnaSemana, ayer);

		assertFalse(rangoPasado.solapa(rangoFuturo));
		assertFalse(rangoFuturo.solapa(rangoPasado));
	}
	
	@Test
	public void testSolapaRangoSinLimiteInferior() throws RangoRecibioDesdeDespuesQueHastaException {
		Integer uno = 1;
		Integer tres = 3;
		Integer diez = 10;
		
		Rango<Integer> rangoSinLimite = new Rango<Integer>(null, diez);
		Rango<Integer> rangoCorto = new Rango<Integer>(uno, tres);

		assertTrue( rangoSinLimite.solapa(rangoCorto) );
		assertTrue( rangoCorto.solapa(rangoSinLimite) );
	}

	@Test
	public void testNoSolapaRangoSinLimiteInferior() throws RangoRecibioDesdeDespuesQueHastaException {
		Integer cinco = 5;
		Integer diez = 10;
		Integer veinte = 20;
		
		Rango<Integer> rangoSinLimite = new Rango<Integer>(null, cinco);
		Rango<Integer> rangoCorto = new Rango<Integer>(diez, veinte);

		assertFalse( rangoSinLimite.solapa(rangoCorto) );
		assertFalse( rangoCorto.solapa(rangoSinLimite) );
	}
	
	@Test
	public void testSolapaRangoSinLimiteSuperior() throws RangoRecibioDesdeDespuesQueHastaException {
		Integer uno = 1;
		Integer tres = 3;
		Integer diez = 10;
		
		Rango<Integer> rangoSinLimite = new Rango<Integer>(tres, null);
		Rango<Integer> rangoCorto = new Rango<Integer>(uno, diez);

		assertTrue( rangoSinLimite.solapa(rangoCorto) );
		assertTrue( rangoCorto.solapa(rangoSinLimite) );
	}

	@Test
	public void testNoSolapaRangoSinLimiteSuperior() throws RangoRecibioDesdeDespuesQueHastaException {
		Integer uno = 1;
		Integer tres = 3;
		Integer diez = 10;
		
		Rango<Integer> rangoSinLimite = new Rango<Integer>(diez, null);
		Rango<Integer> rangoCorto = new Rango<Integer>(uno, tres);

		assertFalse( rangoSinLimite.solapa(rangoCorto) );
		assertFalse( rangoCorto.solapa(rangoSinLimite) );
	}
	
	@Test
	public void testSolapaRangoSinLimites() throws RangoRecibioDesdeDespuesQueHastaException {
		Integer uno = 1;
		Integer tres = 3;
		
		Rango<Integer> rangoSinLimite = new Rango<Integer>(null, null);
		Rango<Integer> rangoCorto = new Rango<Integer>(uno, tres);

		assertTrue( rangoSinLimite.solapa(rangoCorto) );
		assertTrue( rangoCorto.solapa(rangoSinLimite) );
	}
	
	@Test
	public void testEqualsRango() throws RangoRecibioDesdeDespuesQueHastaException {
		Integer uno = 1;
		Integer tres = 3;
		Integer unoP = 1;
		Integer tresP = 3;
		
		Rango<Integer> rango = new Rango<Integer>(uno, tres);
		Rango<Integer> rangoP = new Rango<Integer>(unoP, tresP);

		assertTrue( rango.equals(rangoP) );
		assertTrue( rangoP.equals(rango) );
	}
	
	@Test
	public void testNoEqualsRango() throws RangoRecibioDesdeDespuesQueHastaException {
		Integer uno = 1;
		Integer tres = 3;
		Integer unoP = 1;
		Integer ocho = 8;
		
		Rango<Integer> rango = new Rango<Integer>(uno, tres);
		Rango<Integer> rangoP = new Rango<Integer>(unoP, ocho);

		assertFalse( rango.equals(rangoP) );
		assertFalse( rangoP.equals(rango) );
	}
	
	@Test
	public void testEqualsRangoSinLimiteInferior() throws RangoRecibioDesdeDespuesQueHastaException {
		Integer tres = 3;
		Integer tresP = 3;
		
		Rango<Integer> rango = new Rango<Integer>(null, tres);
		Rango<Integer> rangoP = new Rango<Integer>(null, tresP);

		assertTrue( rango.equals(rangoP) );
		assertTrue( rangoP.equals(rango) );
	}
	
	@Test
	public void testEqualsRangoSinLimites() throws RangoRecibioDesdeDespuesQueHastaException {
		Rango<Integer> rango = new Rango<Integer>(null, null);
		Rango<Integer> rangoP = new Rango<Integer>(null, null);

		assertTrue( rango.equals(rangoP) );
		assertTrue( rangoP.equals(rango) );
	}
	
}
